<?php
class ambnoyFuncs {
	
	public static function updateDossier(formulairedef $formulaireDef, personne $demandeur, $detailForm ){
		$conn = Doctrine_Manager::getInstance()->getConnection('doctrine');
/*		try 
		{*/
			$conn->beginTransaction();
			$detail = $detailForm->save();
			if(!$detail->dossier_id){
				//Creation du dossier
				$dossier = new dossier();
				$dossier->formulairedef = $formulaireDef;
				$dossier->type = $formulaireDef->type;
				$dossier->service = $formulaireDef->type->service;
				$dossier->datedossier = date('Y-m-d');
				$dossier->demandeur = $demandeur;
				$dossier->client = $demandeur;
				$dossier->copyDataFromClient();
				/* TODO 
				 * Terminar de crear el dossier
				 * 	* Calcular la date de réference 
				 * 
				 * */
				
				$dossier->save();
				$wfdef = $dossier->getWorkflow();
				$link = $dossier->createLienEtat($demandeur, $wfdef->etatinitial);
				$link->save();
				
				$detail->dossier = $dossier;
				$detail->save();
				self::createNotifications($dossier, false);
			}else{
				$dossier = $detail->dossier;
			}
			
			$conn->commit();
			return $dossier;
			
		/*}
		catch(Doctrine_Exception $e) {
			$user =  sfContext::getInstance()->getUser();
			die($e);
			$user->setFlash('Erreur',"<h2>Il y a eu une erreur dans l'enregistrement de votre demande</h2><br /><h2>Message erreur original:</h2>$e");

		}*/
		
		
	}

	public static function createNotifications($object, $sendmails, $destinataire = false){
		Util::sendDebug('Creando notifications', 2);
		$classname = get_class($object);
		$personnes = array();
		$return = array();
		if($classname=='message'){
			if(!$destinataire){
				$destinataires = $object->getArrayDestinataires();
			}else{
				Util::sendDebug('envoie une notif à :' . $destinataire->nom);
				$destinataires = array($destinataire->toArray());
			}
		}elseif($classname=='dossier'){
			$destinataires = $object->getArrayDestinataires();
		}
		
		foreach ($destinataires as $destinataire) {
			$creer = true;
			if($classname=='evenement'){
				$q = Doctrine_Query::create()->from('notification n')->where('n.evenementclass = ?', $classname)
						->addWhere('n.evenement_id = ?', $object->id)
						->addWhere('n.personne_id = ?', $destinataire['id']);
				$q->setHydrationMode(Doctrine::HYDRATE_ARRAY);
				if(count(($q->execute()))==0){
					$creer = false;
				}
			}
			if($creer){
				$notification = new notification();
				$notification->evenement_id = $object->id;
				$notification->evenementclass = $classname;
				$notification->personne_id = $destinataire['id'];
				$notification->viewed = false;
				$notification->save();
				if($sendmails){
					//TODO ENVOYER LES MAILS
				}
				$return[] = array('destinataire'=>$destinataire, 'result'=> 'OK - Mensage envoyé');
			}else{
				$return[] = array('destinataire'=>$destinataire, 'result'=> 'Le message avait été envoyé avant');
			}
			;
		}
		
		return $return;
	}
	
	/**
	 * 
	 * Envoye un email au mail établie dans app.yml as mailBigBrother
	 * @deprecated | Pour les dossiers, on envoie un mail avec le changement d'état. Pour les messages, nous n'avons plus besoin d'envoyer des messages
	 * @see dossier::createLienEtat()
	 * 
	 * @param unknown_type $object  |l'objet, sot le dossier, soit le message
	 * @param string $classname
	 */
	
	public static function sendToBigBrother($object, $classname){
		$bigBrother = sfConfig::get('app_mails_mailBigBrother', false);
		if($bigBrother){ //Pour les messages nous ne pouvons pas le faire ici, sinon il envoye un mail pour chaque destinataire.
			if(!is_array($bigBrother)){
				$bigBrother = array($bigBrother);
			}
			$nomFrom = sfConfig::get('app_mails_nomFrom', 'AmbNoy Messenger');
			$mailFrom = sfConfig::get('app_mails_mailFrom', 'no-reply@binova-it.fr');
			if($classname=='message'){
				$subject = "Nouveau message dans l'application";
				$body = "<h1>Un nouveau message à été saisi dans l'application.</h1> <br />";
			}elseif($classname=='dossier'){
				$subject = "Le dossier Nro. " . $object->numero . " a été crée.";
				$body = "<h1>Un nouveau dossier à été saisi dans l'application.</h1> <br />";
			}
			$body .= $object->getTextDescription();
			self::sendMail($bigBrother, $nomFrom, $mailFrom, $subject, $body, $attach = false);
		} 
	}
	
	
	public static function getViewConfig($view, personne $personne, &$objDef = null){
		$return = array();
		$return['extraTemplates'] = array();
		$return['hide'] = array();
		$return['add'] = array();
		$return['title'] = '';
		if($view=='mesdossiersencours'){
			$return['title'] = 'Mes dossiers en cours';
		}elseif($view=='atraiter'){
			$return['title'] = 'Dossiers à traiter';
		}elseif($view=='archive'){
			$return['hide'] = array('getActions'); //Je le laisse pour être sur qu'ils ne peuvent pas l'ajouter
			$return['add'] = array();
			$return['title'] = 'Dossiers archivées';
		}elseif($view=='total'){
			$return['hide'] = array('getActions'); //Je le laisse pour être sur qu'ils ne peuvent pas l'ajouter
			$return['add'] = array();
			$return['title'] = 'Tous les dossiers';
		}
		
		$viewNbResults = $personne->getParam($view.'/NbResults');
		if($viewNbResults===false or ($viewNbResults=='')){
			$viewNbResults = sfConfig::get('app_posts_number_per_page', 10);
		}
		$return['nbResults'] = $viewNbResults;
		
		$viewOrderColumn = $personne->getParam($view.'/OrderColumn');
		if($viewOrderColumn===false){
			$viewOrderColumn = 'id*desc';
		}
		$return['orderColumn'] = $viewOrderColumn;
		
		return $return; 
	}
	
	public static function pager_navigation($pager, $view, $orderCol, $nbPosts)
	{

		$navigation = '';
		if ($pager->haveToPaginate())
		{
			$uri .= (preg_match('/\?/', $uri) ? '&' : '?').'page=';
			// First and previous page
			if ($pager->getPage() != 1)
			{
				$navigation .= '<a href="javascript:refresh(\''.$view.'\',1,'.$nbPosts.',\''.$orderCol.'\');"><img align="absmiddle" src="/images/icons/16/navigation/reculerfull16.png" title="Refresh"/></a>';
				$navigation .= '<a href="javascript:refresh(\''.$view.'\','.$pager->getPreviousPage().','.$nbPosts.',\''.$orderCol.'\');"><img align="absmiddle" src="/images/icons/16/navigation/reculer16.png" title="Refresh"/></a>';
			}

			// Pages one by one
			$links = array();
			 
			foreach($pager->getLinks() as $page)
			{
				if($page == $pager->getPage()){
					$links[] = $page;
				}else{
					$links[] = '<a href="javascript:refresh(\''.$view.'\','.$page.','.$nbPosts.',\''.$orderCol.'\');">'.$page.'</a>';
				}
			}
			 
			$navigation .= join('  ', $links);

			// Next and last page
			if($pager->getPage() != $pager->getLastPage())
			{
				$navigation .= '<a href="javascript:refresh(\''.$view.'\','.$pager->getNextPage().','.$nbPosts.',\''.$orderCol.'\');"><img align="absmiddle" src="/images/icons/16/navigation/avancer16.png" title="Refresh"/></a>';
				$navigation .= '<a href="javascript:refresh(\''.$view.'\','.$pager->getLastPage().','.$nbPosts.',\''.$orderCol.'\');"><img align="absmiddle" src="/images/icons/16/navigation/avancerfull16.png" title="Refresh"/></a>';
			}
		}
		return $navigation;
	}
	
	
	/**
	 * Envoie un mail en utilisant la fonction mail de PHP
 	 * @param array 	$arrayTo	| Tableau des destinataires
	 * @param string 	$nomFrom	| Nom de l'expéditeur
	 * @param string 	$mailFrom	| Mail de l'expéditeur
	 * @param string 	$subject	| Sujet du message
	 * @param string 	$body		| Message
	 * @param string 	$attach
	 * @param boolean 	$priority 	| Niveau d'importance du mail
	 *
	 * @return boolean
	 * */
	
	public static function sendMail($arrayTo, $nomFrom, $mailFrom , $subject, $body, $attach, $priority = 0)
	{		
		Util::sendDebug('************ MAndando desde ' . $nomFrom . ' - ' .  $mailFrom);
		$mailer = sfConfig::get('app_mails_mailapp', 'php_mailer'); // Two values possible php_mailer our swift_mailer
    	Util::sendDebug('Mailer ' . $mailer);
		if($mailer=='swift_mailer')
    	{
    		return self::sendSwiftMail($arrayTo, $nomFrom, $mailFrom , $subject, $body, $attach, $priority);
    	}
    	else
    	{
    		return self::sendPhpMail($arrayTo, $nomFrom, $mailFrom , $subject, $body, $attach, $priority);
    	}
	}
	
	/**
	 * Envoie un mail en utilisant la fonction mail de PHP
 	 * @param array 	$arrayTo	| Tableau des destinataires
	 * @param string 	$nomFrom	| Nom de l'expéditeur
	 * @param string 	$mailFrom	| Mail de l'expéditeur
	 * @param string 	$subject	| Sujet du message
	 * @param string 	$body		| Message
	 * @param string 	$attach
	 * @param boolean 	$priority 	| Niveau d'importance du mail
	 *
	 * @return boolean
	 * */
	public static  function sendPhpMail($arrayTo, $nomFrom, $mailFrom , $subject, $body, $attach, $priority = 0)
	{                             
		$mailValide = true;
		$i = 0;
		foreach($arrayTo as $mailAddress)
		{
			$i++;
			if($mailAddress==''){
				$mailValide = false;
			}else{
				$to .= $mailAddress;
				if($i!=count($arrayTo)){
					$to .= ',';
				}
			}
		}
		if($mailValide)
		{
			
			//require_once'../lib/swift/swift_required.php';
			//Create the message
			$captureMails = sfConfig::get('app_mails_captureMails', false);
			if($captureMails){
				$to = '';
				$arrayTo = sfConfig::get('app_mails_mailsto', array());
				
				foreach($arrayTo as $mailAddress)
				{
					if($mailAddress==''){
						$mailValide = false;
					}else{
						$to .= $mailAddress;
						if($i!=count($arrayTo)){
							$to .= ',';
						}
					}
					$i++;
					Util::sendDebug(' . Sending mail to : '.$mailAddress);
				}				
			}
			$prefij = sfConfig::get('app_mails_objectDefault', '');
			$charset =  sfConfig::get('app_mails_charset', 'utf-8'); // utf-8 or iso-8859-1
			$subjectCharset = mb_detect_encoding($subject);
			if(strtoupper ($subjectCharset)=='UTF-8'){
				$subject = $prefij.utf8_decode($subject);
				$subject = str_replace('?', "'", $subject);
			}else{
				$subject = $prefij.$subject;
			}
			try {
				$headers ='From: "' . $nomFrom . '" <' . $mailFrom .'>'."\n"; 
				//$headers .='Reply-To: andres-externe.lartigue@erdf-grdf.fr'."\n"; 
				$headers .='Content-Type: text/html; charset="'.$charset.'"'."\n"; 
				$headers .='Content-Transfer-Encoding: 8bit'."\n";
				
				if($priority != 0)
				{
					if($priority == 1) // Haute priorite
					{
						$headers .= "X-Priority: 1\n";
			        	$headers .= "X-MSMail-Priority: High\n";
			       		$headers .= "Importance: High\n";						
					}
					elseif ($priority == 3) // Priorite moyenne
					{
						$headers .= "X-Priority: 3\n";
			        	$headers .= "X-MSMail-Priority: Normal\n";
			       		$headers .= "Importance: Normal\n"; 
					}
					elseif ($priority == 5) // Priorite basse
					{
						$headers .= "X-Priority: 5\n";
			        	$headers .= "X-MSMail-Priority: Low\n";
			       		$headers .= "Importance: Low\n"; 					
					}					
				}
								
				if(strpos('no-reply', $mailFrom)!==false) $body .= "<br /><i>Ce message vous est envoy� automatiquement, merci de ne pas r�pondre, il ne pourra �tre lu. </i><br />";
				if(strpos('noreply', $mailFrom)!==false) $body .= "<br /><i>Ce message vous est envoy� automatiquement, merci de ne pas r�pondre, il ne pourra �tre lu. </i><br />";
				
				$bodyCharset = mb_detect_encoding($body);
				
				
				$body = '<html><head><meta http-equiv="Content-Type" content="text/html; charset='.$charset.'" /></head><body>' .($body).' </body></html>';
				if( $attach !='')
				{
					//TODO create add attach function
				}
				
				
			} 
			catch(Exception $e) 
			{
					$user =  sfContext::getInstance()->getUser();
					$user->setFlash('Erreur','The message could\'t be sent. Error message: '.$e->getMessage());
					return false;
			}		
			
			//Send the message
			$envMails = sfConfig::get('app_mails_mailsActive');
			if($envMails)
			{
				try 
				{
					$result = mail($to, $subject, $body, $headers); //, "-f $mailFrom -F $nomFrom" 
				} 
				catch(Exception $e) 
				{
					$user =  sfContext::getInstance()->getUser();
					$user->setFlash('Erreur','The message could\'t be sent. Error message: '.$e->getMessage());
					return false;
				}			  								
			}
			else
			{
				$result = false;	
			}
		}
		else
		{
			$result = false;
		}
		return $result;	
 }
 		
 
 	/**
 	 * Envoie un mail en utilisant le pluging swiftMail de PHP
	 * @param array 	$arrayTo	| Tableau des destinataires
	 * @param string 	$nomFrom	| Nom de l'expéditeur
	 * @param string 	$mailFrom	| Mail de l'expéditeur
	 * @param string 	$subject	| Sujet du message
	 * @param string 	$body		| Message
	 * @param string 	$attach
	 * @param boolean 	$priority 	| Message "important" si true / false par defaut
	 * 
	 * @return boolean				| Niveau d'importance du mail
	 * */

	public static function sendSwiftMail($arrayTo, $nomFrom, $mailFrom , $subject, $body, $attach, $priority = 0)
	{
		$mailValide = true;
		foreach($arrayTo as $mailAddress)
		{
			if($mailAddress=='') $mailValide = false;
			Util::sendDebug(' . Sending mail to : '.$mailAddress);
		}		
		if($mailValide)
		{		
			//Create the message
			$captureMails = sfConfig::get('app_mails_captureMails', false);
			if($captureMails){
				$arrayTo = sfConfig::get('app_mails_mailsto', array());
			}
			$prefij = sfConfig::get('app_mails_objectDefault', '');
			$subject = $prefij.$subject;
			try 
			{
				$message = Swift_Message::newInstance();
				if($priority != 0)
				{
					if($priority == 1) // Priorite haute
					{
						$message->getHeaders()->addTextHeader('X-priority', $priority);
						$message->getHeaders()->addTextHeader('X-MSMail-Priority', 'High');
						$message->getHeaders()->addTextHeader('Importance', 'High');					
					}
					elseif ($priority == 3) // Priorite moyenne
					{
						$message->getHeaders()->addTextHeader('X-priority', $priority);
						$message->getHeaders()->addTextHeader('X-MSMail-Priority', 'Normal');
						$message->getHeaders()->addTextHeader('Importance', 'Normal');	
					}
					elseif ($priority == 5) // Priorite basse
					{
						$message->getHeaders()->addTextHeader('X-priority', $priority);
						$message->getHeaders()->addTextHeader('X-MSMail-Priority', 'Low');
						$message->getHeaders()->addTextHeader('Importance', 'Low');						
					}					
				}
				
				
				// setParameters() takes an associative array
				$type = $message->getHeaders()->get('Content-Type');
				$type->setValue('text/html');
				$charset =  sfConfig::get('app_mails_charset', 'UTF-8'); // utf-8 or iso-8859-1
				$type->setParameter('charset', $charset);
				$message->setCharset($charset);
				
				//Give the message a subject
				$message->setSubject($subject);
				//Définir le From adresse avec un tableau
				$message->setFrom(array($mailFrom => $nomFrom))				
				//Set the To adresses with an associative array
				->setTo($arrayTo);
				
				if(strpos('no-reply', $mailFrom)!==false) $body .= "<br /><i>Ce message vous est envoyé automatiquement, merci de ne pas répondre, il ne pourra être lu. </i><br />";
				if(strpos('noreply', $mailFrom)!==false) $body .= "<br /><i>Ce message vous est envoyé automatiquement, merci de ne pas répondre, il ne pourra être lu. </i><br />";
				
				//Body du message
				$message->setBody('<html><head><meta http-equiv="Content-Type" content="text/html; charset='.$charset.'" /></head><body>' .($body).' </body></html>', 'text/html');
			}
			catch(Exception $e) 
			{
				$user =  sfContext::getInstance()->getUser();
				$user->setFlash('Erreur','The message could\'t be sent. Error message: '.$e->getMessage());
				return false;
			}		
			if($attach!='')
			{
				$message->attach(Swift_Attachment::fromPath($attach));
			}
			//Create the Transport
			//Mail			
			$smtpServer = sfConfig::get('app_mails_smtpServer', '');
			Util::sendDebug('smtpServer: ' . $smtpServer);
			if($smtpServer){
				$smtpUser = sfConfig::get('app_mails_smtpUser', '');
				$smtpPwd = sfConfig::get('app_mails_smtpPwd', '');
				Util::sendDebug('smtpUserInfo: ' . $smtpUser . ' - ' . $smtpPwd);
				$transport = Swift_SmtpTransport::newInstance($smtpServer, 25)
  					->setUsername($smtpUser)
  					->setPassword($smtpPwd);
			}else{
				$transport = Swift_MailTransport::newInstance();				
			}
			//Create the Mailer using your created Transport
			$mailer = Swift_Mailer::newInstance($transport);
			
			//Send the message
			$envMails = sfConfig::get('app_mails_mailsActive', true);
			if($envMails)
			{
				try 
				{
					$result = $mailer->send($message);
				} 
				catch(Exception $e) 
				{
					$user =  sfContext::getInstance()->getUser();
					$user->setFlash('Erreur','The message could\'t be sent. Error message: '.$e->getMessage());
					return false;
				}			  								
			}
			else
			{
				$result = false;	
			}
		}
		else
		{
			$result = false;
		}
		return $result;
 	}	
	
}